package com.boot2.core.dao.datasource;

import java.lang.annotation.*;

/**`
 * @author zhangweilin
 * @date 2019/4/27 10:25
 *   当系统采用动态数据源时，用于在service方法或jpa dao方法上切换数据源，它实际是调用的DynamicDataSourceHolder进行切换。
 * 如果是作用于mybatis操作，能任意切换，如果是jpa,情况要复杂很多.
 * 因为jpa有两种多数据源的方式:
 * 1:如果当前操作是走动态数据源，在同一jpa(hibernate)会话中(注意，任何的异步调用，都是一个新的会话，这里异步包括但是不限于异步方法，
 * 自带Scheduling,spring batch等等全部依赖多线程的全部情况，也就是说，在这种情况，每次都会切换)，DynamicDataSourceHolder只切换一次，
 * 这个由hibernate的底层决定，无法改变，具体代码见LogicalConnectionManagedImpl.acquireConnectionIfNeeded()里一个if决定，此是一个private方法，无法重写。
 * 2:如果当前操作是走固定好的数据源，那么DynamicDataSourceHolder切换是不生效的，也就说明此注解此情况无效
 * 而当前操作具体走哪个数据源，由EnableJpaRepositories中的basePackages和创建LocalContainerEntityManagerFactoryBean决定，具体配置参见demo
 *PS:开启了多数据源时，main类的@EnableJpaRepositories配置需要注释 掉
 *
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface DataSource {
    String value();
}
